package gui;


import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics;
import java.lang.reflect.InvocationTargetException;

import javax.swing.JComponent;
import javax.swing.JPanel;

import mapelements.Renderer;

/**rappresenta un pannello il cui scopo è quello di disegnare
 * un renderer. I Renderer si differenziano in 2 tipi (anche se nella gerarchia tale
 * divisione non è evidenziata): renderer fissi e renderer animati. I renderer
 * fissi hanno generalmente un costruttore vuoto mentre quelli animati hanno generalmente
 * un costruttore che ha come unico parametro il componente che li ospita (per poter effettuaare un
 * <tt>repaint</tt> ogni tot secondi). Per questo questa classe effettua 2 tentativi quando viene costruita:
 * tenta di richiamare il costruttore vuoto (per i renderer fissi) e il costruttore con parametro Component 
 * (per i rnederer animati): in caso entrambi i costruttori falliscano, il Sample viene impostato di
 * colore nero.
 * 
 * @author Daniele
 * @version 1.1
 */
public class Sample extends JPanel {

	private static final long serialVersionUID = 6207555306406547307L;

	/** Il renderer da utilizzare per riempire Sample. */
	private Renderer renderer;
	
	
	public Sample(Renderer _renderer){
		super();
		this.renderer=_renderer;
		this.renderer.setDrawingComponent(this);
	}
	
	/** Costruisce un componente che viene reso graficamente
	 *  utilizzando il renderer che gli viene passato.
	 * @param _renderer il renderer da utilizzarsi.
	 */
	public Sample(Class<Renderer> _renderer){
		super();
		if (_renderer==null){
			this.renderer=null;
			return;
		}
		try {
			this.renderer=_renderer.newInstance();
		} catch (InstantiationException | IllegalAccessException error) {
			//non si può: non è un renderer facile da eseguire. molti renderer però hanno il costruttore Renderer(JComponent): proviamo ad eseguirlo:
			try {
				//FIXME una soluzione davvero pessima!
				//non funge perché alcuni costruttori non richiedono un JCOmponent ma, magari, una sua sottoestensione!
				this.renderer=_renderer.getConstructor(Component.class).newInstance(this);
			} catch (InstantiationException | IllegalAccessException| IllegalArgumentException | InvocationTargetException| NoSuchMethodException | SecurityException error1) {
				//non si può: abbiamo finito i tipici costruttori di un renderer
				renderer=null;
			}
		}
		
	}
	/**colora il Sample con il particolare Renderer. Se il {@link #renderer} è su NULL (poiché magari non è stato possibile costruirlo oppure
	 * perché è impostato su NULL allora viene usato uno sfondo neutro
	 * 
	 */
	public void paintComponent(Graphics g){
		try{
			g.drawImage(renderer.drawRenderer(g),0,0,this.getWidth(),this.getHeight(),this);
		} catch (NullPointerException error){
			g.fillRect(0, 0, this.getWidth(),this.getHeight());
		}
		super.paintComponents(g);
	}
}
